package modulo1.cdp;

import java.util.List;
import javax.persistence.*;

/**
 *
 * @author williams
 */
@Entity
public class Turma extends Objeto {

    @Basic(optional = false)
    private int ano;
    @Basic(optional = false)
    private int periodo;
    @Enumerated(EnumType.STRING)
    private EnumEstadoTurma estado;
    private Integer qntdMinAlunos;
    private Integer qntdMaxAlunos;
    @JoinColumn(name = "id_professor")
    @ManyToOne(optional = true, fetch = FetchType.LAZY)
    private Professor professor;
    @JoinColumn(name = "id_disciplina")
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Disciplina disciplina;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "turma", fetch = FetchType.LAZY)
    private List<Aula> listaAulas;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "turma", fetch = FetchType.EAGER)
    private List<Matricula> listaMatriculas;

    public int getAno() {
        return ano;
    }

    public void setAno(int ano) {
        this.ano = ano;
    }

    public Disciplina getDisciplina() {
        return disciplina;
    }

    public void setDisciplina(Disciplina disciplina) {
        this.disciplina = disciplina;
    }

    public EnumEstadoTurma getEstado() {
        return estado;
    }

    public void setEstado(EnumEstadoTurma estado) {
        this.estado = estado;
    }

    public int getPeriodo() {
        return periodo;
    }

    public void setPeriodo(int periodo) {
        this.periodo = periodo;
    }

    public Professor getProfessor() {
        return professor;
    }

    public void setProfessor(Professor professor) {
        this.professor = professor;
    }

    public Integer getQntdMaxAlunos() {
        return qntdMaxAlunos;
    }

    public void setQntdMaxAlunos(Integer qntdMaxAlunos) {
        this.qntdMaxAlunos = qntdMaxAlunos;
    }

    public Integer getQntdMinAlunos() {
        return qntdMinAlunos;
    }

    public void setQntdMinAlunos(Integer qntdMinAlunos) {
        this.qntdMinAlunos = qntdMinAlunos;
    }

    public List<Aula> getListaAulas() {
        return listaAulas;
    }

    public void setListaAulas(List<Aula> listaAulas) {
        this.listaAulas = listaAulas;
    }

    public List<Matricula> getListaMatriculas() {
        return listaMatriculas;
    }

    public void setListaMatriculas(List<Matricula> listaMatriculas) {
        this.listaMatriculas = listaMatriculas;
    }

    public void alterarEstado() throws Exception {
        if (estado.equals(EnumEstadoTurma.CADASTRADA)) {
            if (professor == null) {
                throw new Exception("Não existe professor cadastrado");
            }
            estado = EnumEstadoTurma.ABERTA;
        } else if (estado.equals(EnumEstadoTurma.ABERTA)) {
            if (getListaMatriculas().size() < qntdMinAlunos) {                
                
                throw new Exception("Não foi atingido a quantidade mínima de alunos. qnt = "+qntdMinAlunos+" size: "+listaMatriculas.size());
            }
            if (getListaMatriculas().size() > qntdMaxAlunos) {
                throw new Exception("A turma possuí mais alunos que o máximo permitido para ela.");
            }
            estado = EnumEstadoTurma.INICIADA;
        } else {
            estado = EnumEstadoTurma.ENCERRADA;
        }
    }
}
